#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：责任链模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 23:21 
"""

"""
责任链模式 (Chain of Responsibility Pattern)
责任链模式是一种行为型设计模式，它允许多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。请求沿着一个链传递，直到有一个对象处理它为止。

在 Python 中，责任链模式通常通过一个抽象处理器类以及一系列具体处理器类来实现。以下是一个简单的示例：

在这个示例中，Handler 是抽象处理器类，定义了处理请求的方法以及一个指向下一个处理器的引用。ConcreteHandlerA 和 ConcreteHandlerB 是具体处理器类，分别实现了处理请求的具体逻辑。

客户端代码创建具体处理器对象，并通过调用 set_successor 方法来设置处理请求的顺序。当请求发送时，它首先被第一个处理器处理，如果第一个处理器无法处理请求，则会传递给下一个处理器，直到有一个处理器能够处理它为止。

责任链模式适用于有多个对象可以处理同一个请求，但不确定到底哪一个对象会处理请求的情况。通过将处理器连接成一条链，可以动态地决定请求的处理者，提高了系统的灵活性和可维护性
"""

from abc import ABC, abstractmethod


# 抽象处理器
class Handler(ABC):
	def __init__(self, successor=None):
		self._successor = successor

	@abstractmethod
	def handle_request(self, request):
		pass

	def set_successor(self, successor):
		self._successor = successor

	def get_successor(self):
		return self._successor


# 具体处理器A
class ConcreteHandlerA(Handler):
	def handle_request(self, request):
		if request == "A":
			print("具体处理器A处理请求")
		else:
			successor = self.get_successor()
			if successor is not None:
				successor.handle_request(request)


# 具体处理器B
class ConcreteHandlerB(Handler):
	def handle_request(self, request):
		if request == "B":
			print("具体处理器B处理请求")
		else:
			successor = self.get_successor()
			if successor is not None:
				successor.handle_request(request)


# 客户端代码
if __name__ == "__main__":
	handler_a = ConcreteHandlerA()
	handler_b = ConcreteHandlerB()

	handler_a.set_successor(handler_b)

	handler_a.handle_request("A")
	handler_a.handle_request("B")
	handler_a.handle_request("C")
